package pe.gob.osce.sirenas.svc;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.apache.log4j.Logger;

import pe.gob.osce.sirenas.dao.FichaArbitralDAOLocal;
import pe.gob.osce.sirenas.dao.FiscalizacionDAOLocal;
import pe.gob.osce.sirenas.dao.NotificacionesDAOLocal;
import pe.gob.osce.sirenas.dao.PersonaDAOLocal;
import pe.gob.osce.sirenas.dao.convert.AuditoriaConvert;
import pe.gob.osce.sirenas.dao.convert.FiscalizaEntidadConvert;
import pe.gob.osce.sirenas.dao.convert.FiscalizacionConvert;
import pe.gob.osce.sirenas.model.AuditoriaDTO;
import pe.gob.osce.sirenas.model.BusquedaFichaDTO;
import pe.gob.osce.sirenas.model.BusquedaFiscalizacionDTO;
import pe.gob.osce.sirenas.model.DocenciaDTO;
import pe.gob.osce.sirenas.model.EspecialidadAcademicaDTO;
import pe.gob.osce.sirenas.model.ExperienciaLaboralDTO;
import pe.gob.osce.sirenas.model.FiscalizaEntidadDTO;
import pe.gob.osce.sirenas.model.FiscalizacionDTO;
import pe.gob.osce.sirenas.model.FormacionAcademicaDTO;
import pe.gob.osce.sirenas.model.NotificacionesDTO;
import pe.gob.osce.sirenas.model.TrayectoriaArbitralDTO;
import pe.gob.osce.sirenas.model.jpa.Auditoria;
import pe.gob.osce.sirenas.model.jpa.Fiscalizacion;
import pe.gob.osce.sirenas.model.jpa.Incidencias;
import pe.gob.osce.sirenas.model.jpa.fiscalizacion.FiscalizaDocencia;
import pe.gob.osce.sirenas.model.jpa.fiscalizacion.FiscalizaEspecialidad;
import pe.gob.osce.sirenas.model.jpa.fiscalizacion.FiscalizaExpLaboral;
import pe.gob.osce.sirenas.model.jpa.fiscalizacion.FiscalizaFormacion;
import pe.gob.osce.sirenas.model.jpa.fiscalizacion.FiscalizaTrayecArbitral;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;


/**
 * Session Bean implementation class RegistrarIncidenciaServiceImpl
 */
@Stateless(mappedName = "RegistrarFiscalizacionService")
public class RegistrarFiscalizacionServiceImpl implements RegistrarFiscalizacionServiceLocal {
	final static Logger log = Logger.getLogger(RegistrarFiscalizacionServiceImpl.class);

	@EJB
	private FiscalizacionDAOLocal fiscalizacionDAOLocal;
	@EJB
	private PersonaDAOLocal personaDAOLocal;
	@EJB
	private FichaArbitralDAOLocal fichaArbitralDAOLocal;
	@EJB
	private NotificacionesDAOLocal notificacionesDAOLocal;
	@EJB
	private RegistrarNotificacionServiceLocal registrarNotificacionService;

	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);


	@Override
	public void generarFiscalizacion(List<BusquedaFiscalizacionDTO> listaFichasSeleccionadas,AuditoriaDTO auditoriaDTO)throws Exception{
		Fiscalizacion fiscalizacion;
		try {
			for (BusquedaFiscalizacionDTO fichaFiscalizable : listaFichasSeleccionadas) {
				fiscalizacion=new Fiscalizacion();
				fiscalizacion.setIdFicha(fichaFiscalizable.getIdFicha());
				fiscalizacion.setCodigoBloque(fichaFiscalizable.getCodBloque());
				fiscalizacion.setIdEstadoProceso(fichaFiscalizable.getIdEstadoProceso() );//Generado
				fiscalizacion.setEstado(1L);
				fiscalizacion.setAuditoria(new Auditoria());
				fiscalizacion.getAuditoria().setFechaRegistro(auditoriaDTO.getFecRegistro());
				fiscalizacion.getAuditoria().setUsuarioRegistro(auditoriaDTO.getUsuarioRegistro());		
				fiscalizacionDAOLocal.insertar(fiscalizacion);
				
				/**Registro de la Notificacion a bandeja*/
				NotificacionesDTO notificacionesDTO=new NotificacionesDTO();
				notificacionesDTO.setIdFicha(fichaFiscalizable.getIdFicha());
				notificacionesDTO.setDescAsunto(propSirenas.getString(ConstanteEJB.NOTIF_FISCALIZA_GENERACION));
				notificacionesDTO.setDescDetalle(propSirenas.getString(ConstanteEJB.NOTIF_DETALLE_FISCA_GENERADO));
				notificacionesDTO.setIndLectura(false);
				registrarNotificacionService.registrarNotificacion(notificacionesDTO, auditoriaDTO);
				/**Implemetar metodo para sacar los correos de Comunicacione sd ela fichaArbitralDTO*/
				
				String toEmail=notificacionesDAOLocal.obtieneCorreosNotificacion(fichaFiscalizable.getIdPersona());
				/**Registro de la Notificacion a Correo Electronico*/
				registrarNotificacionService.enviarCorreoNotificacion(toEmail.trim(), propSirenas.getString(ConstanteEJB.NOTIF_FISCALIZA_GENERACION), propSirenas.getString(ConstanteEJB.NOTIF_DETALLE_GRAL));
				
			}
		} catch (ModeloException e) {
			throw new Exception(e.getMessage(),e);
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB),e);
		}
	}

	@Override
	public List<FiscalizacionDTO>  obtenerHistoricoFiscalizacion(FiscalizacionDTO fiscalizacionDTO)throws Exception{
		List<FiscalizacionDTO> listaFiscalizacionDTO ;
		try {
			/**Obtengo detalle actual de la Fiscalizacion*/
			List<Fiscalizacion> listaFiscalizacionJPA =fiscalizacionDAOLocal.obtieneFiscalizacion(fiscalizacionDTO);
			listaFiscalizacionDTO=FiscalizacionConvert.createListaDTO(listaFiscalizacionJPA);
			
		} catch (ModeloException e) {
			throw new Exception(e.getMessage(),e);
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB),e);
		}
		return listaFiscalizacionDTO;
	}

	@Override
	public Object[]  obtenerDetalleHistoricoFiscalizacion(FiscalizacionDTO fiscalizacionDTO)throws Exception{
		Object[] listas=new Object[5];
		try {
			/**Obtengo detalle actual de la Fiscalizacion*/
			List<DocenciaDTO> listaDocenciaFiscalizada= fiscalizacionDAOLocal.obtieneDetalleFiscalizacionDocencia(fiscalizacionDTO);
			List<EspecialidadAcademicaDTO> listaEspecialidadFiscalizada= fiscalizacionDAOLocal.obtieneDetalleFiscalizacionEspecialidad(fiscalizacionDTO);
			List<ExperienciaLaboralDTO> listaExpLaboralFiscalizada=fiscalizacionDAOLocal.obtieneDetalleFiscalizacionExpLaboral(fiscalizacionDTO);
			List<FormacionAcademicaDTO> listaFormacionFiscalizada=fiscalizacionDAOLocal.obtieneDetalleFiscalizacionFormacion(fiscalizacionDTO);
			List<TrayectoriaArbitralDTO> listaTrayectoriaFiscalizada=fiscalizacionDAOLocal.obtieneDetalleFiscalizacionTrayectoria(fiscalizacionDTO);
			
			listas[0]=listaDocenciaFiscalizada;
			listas[1]=listaEspecialidadFiscalizada;
			listas[2]=listaExpLaboralFiscalizada;
			listas[3]=listaFormacionFiscalizada;
			listas[4]=listaTrayectoriaFiscalizada;
			
		} catch (ModeloException e) {
			throw new Exception(e.getMessage(),e);
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB),e);
		}
		return listas;
	}

	@Override
	public void registrarInicioFiscalizacion(FiscalizacionDTO fiscalizacionDTO,AuditoriaDTO auditoriaDTO)throws Exception{
		Fiscalizacion fiscalizacion;
		try {
			/**Obtengo detalle actual de la Fiscalizacion*/
			List<Fiscalizacion> listaFiscalizacionJPA =fiscalizacionDAOLocal.obtieneFiscalizacion(fiscalizacionDTO);
			if(!listaFiscalizacionJPA.isEmpty()){

				fiscalizacion=listaFiscalizacionJPA.get(0);//Obtengo el primer resultado de la lista
				fiscalizacion.setIdEstadoProceso(fiscalizacionDTO.getIdEstadoProceso() );//Iniciado
				fiscalizacion.setFecInicio( auditoriaDTO.getFecRegistro() );
				fiscalizacion.setUsuarioInicio( auditoriaDTO.getUsuarioRegistro());
				fiscalizacion.getAuditoria().setFechaModifica( auditoriaDTO.getFecRegistro());
				fiscalizacion.getAuditoria().setUsuarioModifica(  auditoriaDTO.getUsuarioRegistro());		
				fiscalizacionDAOLocal.insertar(fiscalizacion);
				
				/**Registro de la Notificacion a bandeja*/
				NotificacionesDTO notificacionesDTO=new NotificacionesDTO();
				notificacionesDTO.setIdFicha(fiscalizacionDTO.getIdFicha());
				notificacionesDTO.setDescAsunto(propSirenas.getString(ConstanteEJB.NOTIF_FISCALIZA_INICIO));
				notificacionesDTO.setDescDetalle(propSirenas.getString(ConstanteEJB.NOTIF_DETALLE_FISCA_INICIO));
				notificacionesDTO.setIndLectura(false);
				registrarNotificacionService.registrarNotificacion(notificacionesDTO, auditoriaDTO);
				/**Implemetar metodo para sacar los correos de Comunicacione sd ela fichaArbitralDTO*/
				
				String toEmail=notificacionesDAOLocal.obtieneCorreosNotificacion(fiscalizacionDTO.getIdPersona());
				/**Registro de la Notificacion a Correo Electronico*/
				registrarNotificacionService.enviarCorreoNotificacion(toEmail, propSirenas.getString(ConstanteEJB.NOTIF_FISCALIZA_INICIO), propSirenas.getString(ConstanteEJB.NOTIF_DETALLE_GRAL));
				
			}else{
				throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
			}
			
		} catch (ModeloException e) {
			throw new Exception(e.getMessage(),e);
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB),e);
		}
	}
	
	@Override
	public void registrarInformeFiscalizacion(FiscalizacionDTO fiscalizacionDTO,AuditoriaDTO auditoriaDTO)throws Exception{
		Fiscalizacion fiscalizacion;
		try {
			/**Obtengo detalle actual de la Fiscalizacion*/
			List<Fiscalizacion> listaFiscalizacionJPA =fiscalizacionDAOLocal.obtieneFiscalizacion(fiscalizacionDTO);
			if(!listaFiscalizacionJPA.isEmpty()){

				fiscalizacion=listaFiscalizacionJPA.get(0);//Obtengo el primer resultado de la lista
				fiscalizacion.setResumen(fiscalizacionDTO.getResumen() );
				fiscalizacion.setDocumentoPDF(fiscalizacionDTO.getDocumentoPDF() );
				fiscalizacion.setNumDocumento(fiscalizacionDTO.getNumDocumento() );
				fiscalizacion.setExpFiscalizacion(fiscalizacionDTO.getExpFiscalizacion() ); 
				fiscalizacion.setIdEstadoProceso(fiscalizacionDTO.getIdEstadoProceso() );//Cerrado
				fiscalizacion.setFecCierre(auditoriaDTO.getFecRegistro() );
				fiscalizacion.setUsuarioCierre(  auditoriaDTO.getUsuarioRegistro());
				
				fiscalizacion.getAuditoria().setFechaModifica( auditoriaDTO.getFecRegistro());
				fiscalizacion.getAuditoria().setUsuarioModifica(  auditoriaDTO.getUsuarioRegistro());		
				fiscalizacionDAOLocal.insertar(fiscalizacion);
				
				/**Registro de la Notificacion a bandeja*/
				NotificacionesDTO notificacionesDTO=new NotificacionesDTO();
				notificacionesDTO.setIdFicha(fiscalizacionDTO.getIdFicha());
				notificacionesDTO.setDescAsunto(propSirenas.getString(ConstanteEJB.NOTIF_FISCALIZA_FIN));
				notificacionesDTO.setDescDetalle(propSirenas.getString(ConstanteEJB.NOTIF_DETALLE_FISCA_FIN));
				notificacionesDTO.setIndLectura(false);
				registrarNotificacionService.registrarNotificacion(notificacionesDTO, auditoriaDTO);
				/**Implemetar metodo para sacar los correos de Comunicacione sd ela fichaArbitralDTO*/
				
				String toEmail=notificacionesDAOLocal.obtieneCorreosNotificacion(fiscalizacionDTO.getIdPersona());
				/**Registro de la Notificacion a Correo Electronico*/
				registrarNotificacionService.enviarCorreoNotificacion(toEmail, propSirenas.getString(ConstanteEJB.NOTIF_FISCALIZA_FIN), propSirenas.getString(ConstanteEJB.NOTIF_DETALLE_GRAL));
				
			}else{
				throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
			}
			
		} catch (ModeloException e) {
			throw new Exception(e.getMessage(),e);
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB),e);
		}
	}

	@Override
	public	List<BusquedaFichaDTO> obtenerBusquedaFiscalizacionPersonalizada(BusquedaFichaDTO obtenerFichaArbitral)
			throws Exception {
		List<BusquedaFichaDTO>	listBusquedaFicha=null;
		
		listBusquedaFicha = personaDAOLocal.obtenerFichaArbitralAdmin(obtenerFichaArbitral);		
		List<Long> fichasEnFiscalizacion=fiscalizacionDAOLocal.listarFichaEnFiscalizacionVigente();	
		///Verifico que las Fichas no estan en Fiscalizacion Vigente
		for (BusquedaFichaDTO busquedaFichaDTO : listBusquedaFicha) {
			for (Long idFicha : fichasEnFiscalizacion) {
				if(busquedaFichaDTO.getIdFicha()==idFicha){
					listBusquedaFicha.remove(busquedaFichaDTO);
					break;
				}
			}
		}
			
		return listBusquedaFicha;
	}

	@Override
	public	List<BusquedaFiscalizacionDTO> obtenerBusquedaFiscalizacion(BusquedaFiscalizacionDTO busquedaFiscalizacionDTO) throws Exception {
		List<BusquedaFiscalizacionDTO>	listBusquedaFiscalizacion=null;
		
		listBusquedaFiscalizacion=fiscalizacionDAOLocal.listarBusquedaFiscalizaciones(busquedaFiscalizacionDTO);			
			
		return listBusquedaFiscalizacion;
	}

	@Override
	public	List<BusquedaFichaDTO> obtenerBusquedaFiscalizacionAleatoria(BusquedaFiscalizacionDTO busquedaFicha) throws Exception {
		
		List<BusquedaFichaDTO>	listBusquedaFicha=new ArrayList<BusquedaFichaDTO>();
		BusquedaFichaDTO obtenerFichaArbitral;

		Integer totalFichas=fichaArbitralDAOLocal.obtenerCantidadTotalFichas();
		busquedaFicha.setTotalFichas(totalFichas);
		if(busquedaFicha.getTipoBusqueda().equals("PORCENTAJE")){
			totalFichas=(int) Math.ceil((totalFichas*busquedaFicha.getValorNumerico())/100.0);
			busquedaFicha.setValorNumerico(totalFichas.longValue());
		}
		if(busquedaFicha.getTipoBusqueda().equals("NUMERO_FICHAS")){
			
		}
		
		List<Long> fichas=fiscalizacionDAOLocal.listarFichasAleatorias(busquedaFicha);
		for (Long idFicha : fichas) {
			obtenerFichaArbitral=new BusquedaFichaDTO();
			obtenerFichaArbitral.setIdFicha(idFicha);
			List<BusquedaFichaDTO>	listTemporal=personaDAOLocal.obtenerFichaArbitralAdmin(obtenerFichaArbitral);
			listBusquedaFicha.add(listTemporal.get(0) );
		}
			
		return listBusquedaFicha;
	}
	
	 

	@Override
	public	FiscalizaEntidadDTO obtieneFiscalizacionDocencia(FiscalizaEntidadDTO fiscalizaEntidadDTO) throws Exception {
		 fiscalizaEntidadDTO=fiscalizacionDAOLocal.obtieneFiscalizacionDocencia(fiscalizaEntidadDTO);			
			
		return fiscalizaEntidadDTO;
	}
	@Override
	public	void registraFiscalizacionDocencia(FiscalizaEntidadDTO fiscalizaEntidadDTO,AuditoriaDTO auditoriaDTO) throws Exception {
		FiscalizaDocencia fiscalizacionDocencia= FiscalizaEntidadConvert.createFiscalizaDocenciaJPA( fiscalizaEntidadDTO, AuditoriaConvert.createJPA(auditoriaDTO));
		fiscalizacionDocencia=fiscalizacionDAOLocal.insertarFiscalizaDocencia( fiscalizacionDocencia);	
	}	
	@Override
	public	FiscalizaEntidadDTO obtieneFiscalizaEspecialidad(FiscalizaEntidadDTO fiscalizaEntidadDTO) throws Exception {
		 fiscalizaEntidadDTO=fiscalizacionDAOLocal.obtieneFiscalizaEspecialidad(fiscalizaEntidadDTO);			
			
		return fiscalizaEntidadDTO;
	}
	@Override
	public	void registraFiscalizaEspecialidad(FiscalizaEntidadDTO fiscalizaEntidadDTO,AuditoriaDTO auditoriaDTO) throws Exception {
		FiscalizaEspecialidad fiscalizaEspecialidad= FiscalizaEntidadConvert.createFiscalizaEspecialidadJPA( fiscalizaEntidadDTO, AuditoriaConvert.createJPA(auditoriaDTO));
		fiscalizaEspecialidad=fiscalizacionDAOLocal.insertarFiscalizaEspecialidad(fiscalizaEspecialidad);	
	}	
	@Override
	public	FiscalizaEntidadDTO obtieneFiscalizaExpLaboral(FiscalizaEntidadDTO fiscalizaEntidadDTO) throws Exception {
		 fiscalizaEntidadDTO=fiscalizacionDAOLocal.obtieneFiscalizaExpLaboral(fiscalizaEntidadDTO);			
			
		return fiscalizaEntidadDTO;
	}
	@Override
	public	void registraFiscalizaExpLaboral(FiscalizaEntidadDTO fiscalizaEntidadDTO,AuditoriaDTO auditoriaDTO) throws Exception {
		FiscalizaExpLaboral fiscalizaExpLaboral= FiscalizaEntidadConvert.createFiscalizaExpLaboralJPA( fiscalizaEntidadDTO, AuditoriaConvert.createJPA(auditoriaDTO));
		fiscalizaExpLaboral=fiscalizacionDAOLocal.insertarFiscalizaExpLaboral(fiscalizaExpLaboral);	
	}	
	@Override
	public	FiscalizaEntidadDTO obtieneFiscalizaFormacion(FiscalizaEntidadDTO fiscalizaEntidadDTO) throws Exception {
		fiscalizaEntidadDTO=fiscalizacionDAOLocal.obtieneFiscalizaFormacion(fiscalizaEntidadDTO);			
		return fiscalizaEntidadDTO;
	}
	@Override
	public	void registraFiscalizaFormacion(FiscalizaEntidadDTO fiscalizaEntidadDTO,AuditoriaDTO auditoriaDTO) throws Exception {
		FiscalizaFormacion fiscalizaFormacion= FiscalizaEntidadConvert.createFiscalizaFormacionJPA(fiscalizaEntidadDTO, AuditoriaConvert.createJPA(auditoriaDTO));
		fiscalizaFormacion=fiscalizacionDAOLocal.insertarFiscalizaFormacion(fiscalizaFormacion);	
		
	}	
	@Override
	public	FiscalizaEntidadDTO obtieneFiscalizaTrayecArbitral(FiscalizaEntidadDTO fiscalizaEntidadDTO) throws Exception {
		 fiscalizaEntidadDTO=fiscalizacionDAOLocal.obtieneFiscalizaTrayecArbitral(fiscalizaEntidadDTO);		
		return fiscalizaEntidadDTO;
	}
	@Override
	public	void registraFiscalizaTrayecArbitral(FiscalizaEntidadDTO fiscalizaEntidadDTO,AuditoriaDTO auditoriaDTO) throws Exception {
		FiscalizaTrayecArbitral fiscalizaTrayecArbitral= FiscalizaEntidadConvert.createFiscalizaTrayecArbitralJPA( fiscalizaEntidadDTO, AuditoriaConvert.createJPA(auditoriaDTO));
		fiscalizaTrayecArbitral=fiscalizacionDAOLocal.insertarFiscalizaTrayecArbitral(fiscalizaTrayecArbitral);	
	}
}
